winsafe\oleaut\structs/
structs_other.rs

1#![allow(non_snake_case)]
2
3use std::marker::PhantomData;
4use std::mem::ManuallyDrop;
5
6use crate::co;
7use crate::decl::*;
8use crate::kernel::{ffi_types::*, privs::*};
9use crate::oleaut::{ffi, privs::*};
10
11/// [`DISPPARAMS`](https://learn.microsoft.com/en-us/windows/win32/api/oaidl/ns-oaidl-dispparams)
12/// struct.
13#[repr(C)]
14pub struct DISPPARAMS<'a, 'b> {
15	rvarg: *mut VARIANT, // in reverse order
16	rgdispidNamedArgs: *mut co::DISPID,
17	cArgs: u32,
18	cNamedArgs: u32,
19
20	_rvar: PhantomData<&'a mut VARIANT>,
21	_rgdispidNamedArgs: PhantomData<&'b mut co::DISPID>,
22}
23
24impl_default!(DISPPARAMS, 'a, 'b);
25
26impl<'a, 'b> DISPPARAMS<'a, 'b> {
27	pub_fn_array_buf_get_set!('a, rvarg, set_rvarg, cArgs, VARIANT);
28	pub_fn_array_buf_get_set!('b, rgdispidNamedArgs, set_rgdispidNamedArgs, cNamedArgs, co::DISPID);
29}
30
31/// [`EXCEPINFO`](https://learn.microsoft.com/en-us/windows/win32/api/oaidl/ns-oaidl-excepinfo)
32/// struct.
33///
34/// This struct is returned in case of remote exception by
35/// [`IDispatch::Invoke`](crate::prelude::oleaut_IDispatch::Invoke); in order to
36/// provide full security, it implements the standard [`Drop`](std::ops::Drop)
37/// trait to free the [`BSTR`](crate::BSTR) pointers.
38#[repr(C)]
39pub struct EXCEPINFO {
40	pub wCode: u16,
41	wReserved: u16,
42	bstrSource: *mut u16,
43	bstrDescription: *mut u16,
44	bstrHelpFile: *mut u16,
45	pub dwHelpContext: u32,
46	pvReserved: *mut std::ffi::c_void,
47	pfnDeferredFillIn: *mut std::ffi::c_void,
48	pub scode: i32,
49}
50
51unsafe impl Send for EXCEPINFO {}
52unsafe impl Sync for EXCEPINFO {}
53
54impl Drop for EXCEPINFO {
55	fn drop(&mut self) {
56		if !self.bstrSource.is_null() {
57			let _ = unsafe { BSTR::from_ptr(self.bstrSource) };
58		}
59		if !self.bstrDescription.is_null() {
60			let _ = unsafe { BSTR::from_ptr(self.bstrDescription) };
61		}
62		if !self.bstrHelpFile.is_null() {
63			let _ = unsafe { BSTR::from_ptr(self.bstrHelpFile) };
64		}
65	}
66}
67
68impl std::error::Error for EXCEPINFO {
69	fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
70		None
71	}
72}
73
74impl std::fmt::Display for EXCEPINFO {
75	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
76		write!(
77			f,
78			"{} - {}",
79			self.bstrSource().unwrap_or("(no source)".to_owned()),
80			self.bstrDescription()
81				.unwrap_or("(no description)".to_owned()),
82		)
83	}
84}
85impl std::fmt::Debug for EXCEPINFO {
86	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87		std::fmt::Display::fmt(self, f)
88	}
89}
90
91impl_default!(EXCEPINFO);
92
93impl EXCEPINFO {
94	pub_fn_bstr_get!(bstrSource);
95	pub_fn_bstr_get!(bstrDescription);
96	pub_fn_bstr_get!(bstrHelpFile);
97}
98
99/// [`PROPERTYKEY`](https://learn.microsoft.com/en-us/windows/win32/api/wtypes/ns-wtypes-propertykey)
100/// struct.
101#[repr(C, packed(2))]
102#[derive(Clone, Copy, PartialEq, Eq)]
103pub struct PROPERTYKEY {
104	pub fmtid: GUID,
105	pub pid: u32,
106}
107
108impl_default!(PROPERTYKEY);
109
110impl AsRef<PROPERTYKEY> for PROPERTYKEY {
111	fn as_ref(&self) -> &PROPERTYKEY {
112		self
113	}
114}
115
116impl PROPERTYKEY {
117	/// Creates a new `PROPERTYKEY` by setting `pid` to `PID_FIRST_USABLE`
118	/// (`0x02`).
119	#[must_use]
120	pub const fn new(fmtid: GUID) -> Self {
121		Self { fmtid, pid: PID_FIRST_USABLE }
122	}
123}
124
125/// [`PROPVARIANT`](https://learn.microsoft.com/en-us/windows/win32/api/propidlbase/ns-propidlbase-propvariant)
126/// struct.
127///
128/// Should be manipulated through the [`PropVariant`](crate::PropVariant) enum.
129#[repr(C)]
130pub struct PROPVARIANT {
131	pub(crate) vt: co::VT,
132	wReserved1: u16,
133	wReserved2: u16,
134	wReserved3: u16,
135	pub(crate) data: PROPVARIANT_union,
136}
137
138#[repr(C)]
139pub(crate) union PROPVARIANT_union {
140	pub(crate) cVal: i8,
141	pub(crate) bVal: u8,
142	pub(crate) iVal: i16,
143	pub(crate) uiVal: u16,
144	pub(crate) lVal: i32,
145	pub(crate) ulVal: u32,
146	pub(crate) hVal: i64,
147	pub(crate) uhVal: u64,
148	pub(crate) fltVal: f32,
149	pub(crate) dblVal: f64,
150	pub(crate) ptr: *mut std::ffi::c_void, // for all pointer fields
151	pub(crate) cac: ManuallyDrop<CAC>,
152}
153
154#[repr(C)]
155pub(crate) struct CAC {
156	cElems: u32,
157	pElems: *mut i8,
158}
159
160impl Drop for PROPVARIANT {
161	fn drop(&mut self) {
162		if self.vt() != co::VT::EMPTY {
163			unsafe {
164				ffi::PropVariantClear(self as *mut _ as _); // ignore errors
165			}
166		}
167	}
168}
169
170impl_default!(PROPVARIANT); // PropVariantInit() is just a macro
171
172impl PROPVARIANT {
173	/// Returns the [`co::VT`](crate::co::VT) variant type currently being held.
174	#[must_use]
175	pub const fn vt(&self) -> co::VT {
176		self.vt
177	}
178}
179
180/// [`VARIANT`](https://learn.microsoft.com/en-us/windows/win32/api/oaidl/ns-oaidl-variant)
181/// struct.
182///
183/// Should be manipulated through the [`Variant`](crate::Variant) enum.
184#[repr(C)]
185pub struct VARIANT {
186	pub(crate) vt: co::VT,
187	wReserved1: u16,
188	wReserved2: u16,
189	wReserved3: u16,
190	pub(crate) data: VARIANT_union,
191}
192
193#[repr(C)]
194pub(crate) union VARIANT_union {
195	pub(crate) llVal: i64,
196	pub(crate) lVal: i32,
197	pub(crate) bVal: u8,
198	pub(crate) iVal: i16,
199	pub(crate) fltVal: f32,
200	pub(crate) dblVal: f64,
201	pub(crate) cVal: i8,
202	pub(crate) uiVal: u16,
203	pub(crate) ulVal: u32,
204	pub(crate) ullVal: u64,
205	pub(crate) ptr: *mut std::ffi::c_void, // for all pointer fields
206	pub(crate) brecord: ManuallyDrop<BRECORD>,
207}
208
209#[repr(C)]
210pub(crate) struct BRECORD {
211	pvRecord: *mut std::ffi::c_void,
212	pRecInfo: COMPTR,
213}
214
215impl Drop for VARIANT {
216	fn drop(&mut self) {
217		if self.vt != co::VT::EMPTY {
218			unsafe {
219				ffi::VariantClear(self as *mut _ as _); // ignore errors
220			}
221		}
222	}
223}
224
225impl Default for VARIANT {
226	fn default() -> Self {
227		let mut obj = unsafe { std::mem::zeroed::<Self>() };
228		unsafe {
229			ffi::VariantInit(pvoid(&mut obj));
230		}
231		obj
232	}
233}
234
235impl VARIANT {
236	/// Returns the [`co::VT`](crate::co::VT) variant type currently being held.
237	#[must_use]
238	pub const fn vt(&self) -> co::VT {
239		self.vt
240	}
241}